//
//  XHRefreshControl.swift
//  weibobbaj
//
//  Created by Tiffany宝 on 16/4/24.
//  Copyright © 2016年 Tiffany. All rights reserved.
//

import UIKit

let XHRefreshControlH: CGFloat = 50

enum XHRefreshControlState: String{
    
    case Normal = "默认状态"
    case Pulling = "松手进行刷新状态"
    case Refresh = "刷新状态"
}

class XHRefreshControl: UIControl {
    
    //当前刷新的状态
    var xhState: XHRefreshControlState = .Normal{
        
        didSet{
            switch xhState{
                
            case XHRefreshControlState.Pulling:
                //箭头朝上
                UIView.animateWithDuration(0.3, animations: { () -> Void in
                    self.arrowImageView.transform = CGAffineTransformMakeRotation(CGFloat(M_PI))
                    //                                   self.arrowImageView.transform = CGAffineTransformRotate(self.arrowImageView.transform, CGFloat(M_PI))
                })
                //更改文字
                msgLabel.text = "松手刷新"
                
            case .Normal:
                //箭头朝下
                UIView.animateWithDuration(0.3, animations: { () -> Void in
                    self.arrowImageView.transform = CGAffineTransformIdentity
                    //                self.arrowImageView.transform = CGAffineTransformRotate(self.arrowImageView.transform, CGFloat(M_PI))
                })
                //菊花停止
                activityIndicatorView.stopAnimating()
                //显示箭头
                arrowImageView.hidden = false
                //更改文字
                msgLabel.text = "下拉刷新"
                
            case .Refresh:
                //菊花转
                activityIndicatorView.startAnimating()
                //隐藏箭头
                arrowImageView.hidden = true
                //更改文字
                msgLabel.text = "正在刷新"
                
                //使刷新控件往下移,显示在导航条下面
                UIView.animateWithDuration(0.3, animations: { () -> Void in
                    self.tableView?.contentInset.top =  self.tableView!.contentInset.top + XHRefreshControlH
                })
                
                //调用 tableView 刷新的方法
                sendActionsForControlEvents(UIControlEvents.ValueChanged)
                
            }
        }
    }
    
    // *** 当前控件的父控件
    weak var tableView: UIScrollView?
    
    override init(frame: CGRect) {
        
        super.init(frame: frame)
        setupUI()
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    func endRefreshing(){
        
        //什么情况下吧状态置为Normal -----> 上一个状态为 Refresh
        if xhState == .Refresh{
            
            //使刷新控件往上移,隐藏在导航条下面
            UIView.animateWithDuration(0.3, animations: { () -> Void in
                self.tableView?.contentInset.top =  self.tableView!.contentInset.top - XHRefreshControlH
            })
            //把状态置为Normal
            xhState = .Normal
        }
    }
    
    
    //  UIControl 比 UIView 多一个功能：可以给控件添加不同状态下执行不同的方法的这么一个功能
    // 在控制器里面给 XHRefreshControl 添加要执行方法（TouchUpInside）
    // 在 XHRefreshControl 里面可以调用  sendActionsForControlEvents 传入 TouchUpInside 就可以执行 控制器里面 添加方法
    private func setupUI(){
        
        backgroundColor = UIColor.darkGrayColor()
        //        self.frame.size.width = SCREENW
        self.frame.size.height = XHRefreshControlH
        
        //原点是以 tableView 为坐标系的参照点
        self.frame.origin.y = -XHRefreshControlH
        
        //添加控件
        addSubview(arrowImageView)
        addSubview(msgLabel)
        addSubview(activityIndicatorView)
        
        //添加约束
        arrowImageView.snp_makeConstraints { (make) -> Void in
            
            make.centerX.equalTo(self).offset(-35)
            make.centerY.equalTo(self)
        }
        
        msgLabel.snp_makeConstraints { (make) -> Void in
            
            make.leading.equalTo(arrowImageView.snp_trailing).offset(10)
            make.centerY.equalTo(arrowImageView)
        }
        
        activityIndicatorView.snp_makeConstraints { (make) -> Void in
            
            make.center.equalTo(arrowImageView)
        }
    }
    
    // 将要被添加到一个父控件上的时候就会调用,可以拿到父控件进行操作
    override func willMoveToSuperview(newSuperview: UIView?) {
        
        super.willMoveToSuperview(newSuperview)
        
        guard let tableView = newSuperview else {
            
            return
        }
        
        self.tableView = tableView as? UIScrollView
        
        frame.size.width = tableView.bounds.width
        
        //使用 KVO 对 contentOffset 属性进行观察
        // 如果使用 KVO：我们需要监听tableView的 contentOffset，就需要给 tableView添加一个观察者
        tableView.addObserver(self, forKeyPath: "contentOffset", options: NSKeyValueObservingOptions.New, context: nil)
    }
    
    // 当观察的对象身上的属性发生改变的时候，就会回调这个方法
    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        
        //        print(change)
        let contentOffset = self.tableView!.contentOffset
        // 在 iOS 7 之后，如果tableView界面有导航条的话，会把tableView的内容整体往下偏移64
        //        print("contentInset.top==\(self.tableView!.contentInset.top)") //64
        //        print("contentOffset.y==\(contentOffset.y)") //-64
        
        //判断用户是否松手刷新,来确定状态
        if tableView!.dragging{
            
            //用户没松手
            if contentOffset.y < -114 && xhState == .Normal {//过滤了<-114 和 刷新的状态
                
                print("控件已经完全显示出来了--.Pulling")
                xhState = .Pulling
                
            }else {
                if contentOffset.y >= -114 && xhState == .Pulling {//过滤了>=-114 和 刷新的状态
                    print("控件还没有完全显示出来--.Normal")
                    xhState = .Normal
                }
            }
            
        }else{
            
            //**** 不要忘记判断 状态
            if xhState == .Pulling{
                //用户松手了
                print("控件刷新中--.Refresh")
                xhState = XHRefreshControlState.Refresh
            }
        }
    }
    
    //移除监听者
    deinit{
        
        self.tableView!.removeObserver(self, forKeyPath: "contentOffset")
    }
    
    //懒加载子控件
    private lazy var arrowImageView = UIImageView(image: UIImage(named: "tableview_pull_refresh"))
    private lazy var msgLabel: UILabel = {
        
        let label = UILabel(textFont: 12, textColor: UIColor.whiteColor())
        
        label.text = "下拉刷新"
        
        return label
    }()
    private lazy var activityIndicatorView = UIActivityIndicatorView()
    
}






